#ifndef KEYMAP_H
#define KEYMAP_H

#ifdef SCI_NAMESPACE
namespace Scintilla {
#endif

#define SCI_NORM 0
#define SCI_SHIFT SCMOD_SHIFT
#define SCI_CTRL SCMOD_CTRL
#define SCI_ALT SCMOD_ALT
#define SCI_META SCMOD_META
#define SCI_CSHIFT (SCI_CTRL | SCI_SHIFT)
#define SCI_ASHIFT (SCI_ALT | SCI_SHIFT)

  class KeyModifiers {
    public:
      int key;
      int modifiers;
      KeyModifiers( int key_, int modifiers_ ) : key( key_ ), modifiers( modifiers_ ) {
      }
      bool operator<( const KeyModifiers &other ) const {
        if( key == other.key ) {
          return modifiers < other.modifiers;
        } else
        { return key < other.key; }
      }
  };


  class KeyToCommand {
    public:
      int key;
      int modifiers;
      unsigned int msg;
  };

  class KeyMap {
      std::map<KeyModifiers, unsigned int> kmap;
      static const KeyToCommand MapDefault[];

    public:
      KeyMap();
      ~KeyMap();
      void Clear();
      void AssignCmdKey( int key, int modifiers, unsigned int msg );
      unsigned int Find( int key, int modifiers ) const; // 0 returned on failure
  };

  #ifdef SCI_NAMESPACE
}
  #endif

#endif
